package com.luxsoft.siipap.em.replica.importadores.cxc;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.jdbc.core.RowMapper;

import com.luxsoft.siipap.model.CantidadMonetaria;
import com.luxsoft.siipap.model.Direccion;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.model.core.Contacto;
import com.luxsoft.siipap.model.core.ClienteCredito;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.ValidationUtils;
import com.luxsoft.siipap.ventas.model.Cobrador;
import com.luxsoft.siipap.ventas.model.Vendedor;

/**
 * Mapper de cliente de DBF a {@link Cliente}
 * 
 * @author Ruben Cancino
 *
 */
public class ClienteMapper implements RowMapper{
	
	private Logger logger=Logger.getLogger(getClass());
	
	public ClienteMapper(){
		cobradores.addAll(ServiceLocator2.getUniversalDao().getAll(Cobrador.class));
		vendedores.addAll(ServiceLocator2.getUniversalDao().getAll(Vendedor.class));
	}
	
	private List<Cobrador> cobradores=new ArrayList<Cobrador>();
	private List<Vendedor> vendedores=new ArrayList<Vendedor>();
	
	public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
		Cliente c=new Cliente();
		c.setClave(rs.getString("CLAVE"));
		c.setNombre(rs.getString("NOMBRE"));
		c.setRfc(rs.getString("RFC"));
		Direccion d=new Direccion();
		d.setCalle(rs.getString("CALLE"));
		d.setColonia(rs.getString("COLONIA"));
		d.setMunicipio(rs.getString("ENTIDAD"));
		d.setCp(rs.getString("CPOSTAL"));
		c.setDireccionFiscal(d);
		int plazo=rs.getInt("PLAZO");
		String cre=rs.getString("TIPO");
		if(!StringUtils.isBlank(cre) && cre.equals("CRE")){
			ClienteCredito credito=new ClienteCredito();
			credito.setDiacobro(rs.getInt("DIA_PAGO"));
			credito.setDiarevision(rs.getInt("DIA_REVISION"));
			//BigDecimal cred=rs.getBigDecimal("IMPORTE");
			BigDecimal cred=rs.getBigDecimal("LIMITE");
			if(cred==null){
				cred=BigDecimal.ZERO;
			}
			credito.setLinea(CantidadMonetaria.pesos(cred.doubleValue()));
			credito.setPlazo(plazo);
			
			credito.setRevision(true);
			credito.setSuspendido(false);
			
			String  tipoVencimiento=rs.getString("TIPO_VENCIMIENTO");
			credito.setVencimientoFactura(StringUtils.equalsIgnoreCase(tipoVencimiento, "F"));
			credito.setChequePostfechado(rs.getBoolean("CHEQUEP"));
			credito.setConNotaAnticipada(rs.getBoolean("CNOTA"));
			credito.setSuspenderDescuento(rs.getBoolean("SUSPDESCTO"));
			credito.setDescuentoEstimado(rs.getDouble("DESC_ESTIMADO"));
			c.setCredito(credito);
			credito.setCliente(c);
			//c.habilitarCredito(credito);
		}
		final long cobrador=rs.getLong("COBRADOR");
		final long vendedor=rs.getLong("VENDEDOR");
		Cobrador cob=(Cobrador)CollectionUtils.find(cobradores, new Predicate(){
			public boolean evaluate(Object input) {
				Cobrador cc=(Cobrador)input;
				return cc.getId().longValue()==cobrador;
			}
		});
		c.setCobrador(cob);
		Vendedor vend=(Vendedor)CollectionUtils.find(vendedores, new Predicate(){
			public boolean evaluate(Object input) {
				Vendedor cc=(Vendedor)input;
				return cc.getId().longValue()==vendedor;
			}
		});
		c.setFrecuente(rs.getBoolean("FRECUENTE"));
		c.setCuentaContable(rs.getString("CUENTA"));
		c.setVendedor(vend);
		
		return c;
	}
	
	@SuppressWarnings("unused")
	public Object mapRowOld(ResultSet rs, int rowNum) throws SQLException {
		String CLICLAVE=rs.getString("CLICLAVE");		
		String CLINOMBRE=rs.getString("CLINOMBRE");
		
		String CLICALLE=rs.getString("CLICALLE");
		String CLICOLON=rs.getString("CLICOLON");
		String CLIDELEG=rs.getString("CLIDELEG");
		String CLIPOSTAL=rs.getString("CLIPOSTAL");
		String CLITEL1=rs.getString("CLITEL1");
		String CLIFAX=rs.getString("CLIFAX");
		String CLIRFC=rs.getString("CLIRFC");
		String CLICUENTA=rs.getString("CLICUENTA");
		String CLIOBSCLAS=rs.getString("CLIOBSCLAS");
		String CLIGERGRAL=rs.getString("CLIGERGRAL");
		String CLIGERCOMP=rs.getString("CLIGERCOMP");
		
		// Propiedades del DBF sin usuar
		String CLICLAVORI=rs.getString("CLICLAVORI");
		Number CLIREVISIO=(Number)rs.getDouble("CLIREVISIO");
		Number CLIPAGO=(Number)rs.getDouble("CLIPAGO");
		Number CLICOBRADO=(Number)rs.getDouble("CLICOBRADO");
		Number CLIAGENTE=(Number)rs.getDouble("CLIAGENTE");
		Number CLILIMITE=(Number)rs.getDouble("CLILIMITE");
		Date CLIFECREAL=rs.getDate("CLIFECREAL");
		Date CLIFECSIAL=rs.getDate("CLIFECSIAL");
		Date CLISUSPEN=rs.getDate("CLISUSPEN");
		String CLICOMSUS=rs.getString("CLICOMSUS");
		String CLIOBSGRAL=rs.getString("CLIOBSGRAL");		
		Number CLICLASIFI=(Number)rs.getDouble("CLICLASIFI");
		Date CLIFECLASI=rs.getDate("CLIFECLASI");		
		String CLICEDULA=rs.getString("CLICEDULA");
		Number CLIPLAZO=(Number)rs.getDouble("CLIPLAZO");
		String CLITIPVTO=rs.getString("CLITIPVTO");
		String CLIPAGARE=rs.getString("CLIPAGARE");
		String CLIOPEDEPU=rs.getString("CLIOPEDEPU");
		Date CLIFECDEPU=rs.getDate("CLIFECDEPU");
		Number CLIBACOCO=(Number)rs.getDouble("CLIBACOCO");
		Number CLIBACOVE=(Number)rs.getDouble("CLIBACOVE");
		String CLIESLIDER=rs.getString("CLIESLIDER");
		String CLILIDER=rs.getString("CLILIDER");
		String CLIESTADO=rs.getString("CLIESTADO");
		String CLICOMEDO=rs.getString("CLICOMEDO");
		String CLICOTIZA=rs.getString("CLICOTIZA");
		String CLICOMCOT=rs.getString("CLICOMCOT");
		String CLIPEDIDO=rs.getString("CLIPEDIDO");
		String CLICOMPED=rs.getString("CLICOMPED");
		String CLIFACTUR=rs.getString("CLIFACTUR");
		
		String CLICOMFAC=rs.getString("CLICOMFAC");
		Number CLIPORCDES=(Number)rs.getDouble("CLIPORCDES");
		Number CLIPORCDE2=(Number)rs.getDouble("CLIPORCDE2");
		String CLITIPO=rs.getString("CLITIPO");
		String CLICTRLGRA=rs.getString("CLICTRLGRA");
		String CLIFORPAGO=rs.getString("CLIFORPAGO");
		String CLIMOIMPNI=rs.getString("CLIMOIMPNI");
		Number CLIABOGADO=(Number)rs.getDouble("CLIABOGADO");
		Date CLIFEASIAB=rs.getDate("CLIFEASIAB");
		Number CLIOPERADO=(Number)rs.getDouble("CLIOPERADO");
		Number CLIUSUAR=(Number)rs.getDouble("CLIUSUAR");
		Number CLIBACOVC=(Number)rs.getDouble("CLIBACOVC");
		Date CLIFATENCL=rs.getDate("CLIFATENCL");
		Date CLIFATENMO=rs.getDate("CLIFATENMO");
		String CLIAATENCL=rs.getString("CLIAATENCL");
		String CLIAATENMO=rs.getString("CLIAATENMO");
		String CLIEMAIL=rs.getString("CLIEMAIL");
		String CLITELANT=rs.getString("CLITELANT");
		String CLIFAXANT=rs.getString("CLIFAXANT");
		String CLIGIROEMP=rs.getString("CLIGIROEMP");
		String CLIMANUAL=rs.getString("CLIMANUAL");
		String CLILIPRCRE=rs.getString("CLILIPRCRE");
		Date CLIALPRCRE=rs.getDate("CLIALPRCRE");
		String CLILIPRCON=rs.getString("CLILIPRCON");
		Date CLIALPRCON=rs.getDate("CLIALPRCON");
		String CLIEQUIORG=rs.getString("CLIEQUIORG");
		String CLIHORAREG=rs.getString("CLIHORAREG");
		String CLIACCES=rs.getString("CLIACCES");
		String CLIVERSION=rs.getString("CLIVERSION");
		
		Cliente c=new Cliente();
		c.setClave(CLICLAVE);
		c.setNombre(CLINOMBRE);
		c.setRfc(CLIRFC);
		c.setCuentaContable(CLICUENTA);
		
		
		Direccion d=new Direccion();
		d.setCalle(CLICALLE);
		d.setCiudad("");
		d.setColonia(CLICOLON);
		d.setCp(CLIPOSTAL);
		d.setEstado(CLIESTADO);
		d.setMunicipio(CLIDELEG);
		d.setNumero("");
		
		if(ValidationUtils.isValid(d))		
			c.setDireccionFiscal(d);
		else
			logger.warn("Errores en la direccion del cliente");
		
		
		c.agregarTelefono("Tel 1", CLITEL1);
		c.agregarTelefono("Fax 1", CLIFAX);
		c.setEmail(CLIEMAIL);
		if(!StringUtils.isBlank(CLIGERGRAL)){
			Contacto con=new Contacto(CLIGERGRAL,"Gerente general");
			c.agregarContacto(con);
		}
		if(!StringUtils.isBlank(CLIGERCOMP)){
			Contacto con=new Contacto(CLIGERCOMP,"Gerente compras");
			c.agregarContacto(con);
		}
		if(!StringUtils.isBlank(CLIOBSCLAS))
			c.agregarComentario("Comentario 1", CLIOBSCLAS);
		
		
		return c;
	}

}
